package _Morpion;

import java.util.ArrayList;

/**
 * @author Edwin
 * Modelisation d'un jeu de morpion
 * 
 */
public class Morpion {
	
	private static Cellule[][] m_grille;
	private int m_L, m_H;
	private ArrayList m_alignementsX, m_alignementsO, m_journalCoups;
	
	/// --- 				Premier constructor normal
	
	public Morpion(int lo, int la){
		m_L = lo;
		m_H = la;
	}
	
	///---					Accesseurs de consultation
	
	//	Methode getL
	public int getL(){
		return m_L;
	}
	
	//	Methode getH
	
	public int getH(){
		return m_H;
	}
	
	//	Methode getGrille
	
	public static Cellule[][] getGrille(){
		return m_grille;
	}
	
	//	Methode getCellule
	public Cellule getCellule(int x, int y){
		return m_grille[x][y];
	}
	
	///---					Methode setCellule
	
	public void setCellule(int x, int y, char symbole) throws Exception{
		//	Exception sortie de matrice
		if(x >= m_L || y >= m_H) throw new Exception ();
		
		//	Exception case occupee
		if(m_grille[x][y] != null) throw new Exception();
		
		// Affectation de la cellule
		m_grille[x][y] = new Cellule(x, y, symbole);
		
	}
	
	///---					Methode toString()
	
	public String toString(){
		int i, j;
		String chaine = "";
		for(i=0; i<m_L; i++){
			for(j=0; j<m_H; j++){
				chaine += getCellule(i,j).toString();
			}
		}
		return chaine;
	}
	
	///---					Methode clone
	
	protected Object clone(){
		Morpion res = null;
		res = new Morpion(m_L, m_H);
		res.m_grille = (Cellule[][])m_grille.clone();
		res.m_alignementsX = (ArrayList)m_alignementsX.clone();
		res.m_alignementsO = (ArrayList)m_alignementsO.clone();
		res.m_journalCoups = (ArrayList)m_journalCoups.clone();
		return res;
	}
	
	///---					Methode equals
	
	public boolean equals(Object op2){
		return m_grille.equals(((Morpion)op2).m_grille) && m_alignementsX.equals(((Morpion)op2).m_alignementsX) &&  m_alignementsO.equals(((Morpion)op2).m_alignementsO) &&  m_journalCoups.equals(((Morpion)op2).m_journalCoups);
	}
	
	///---					Methode getScore
	
	public int getScore(char joueur){
		if (joueur=='X') return m_alignementsX.size();
		return m_alignementsO.size();
	}

	//detecterH detecterV a faire
}
